#!/usr/bin/env python
# 基于UDP的聊天室程序：客户端
# 多开几个客户端即可实现多人同时在线聊天
import socket
import os
import sys


def main():
    # 输入IP地址和端口号
    if len(sys.argv) < 3:
        print('参数错误')
        return
    address = (sys.argv[1], int(sys.argv[2]))
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字
    while True:  # 注册或登录
        operation = input('选择操作类型（1.register  2.login）：')
        if (operation != '1') & (operation != '2'):
            print('输入错误')
            continue
        name = input('输入用户名（不含空格）：')
        password = input('输入密码（不含空格）：')
        message = operation + ' ' + name + ' ' + password
        client.sendto(message.encode(), address)  # 发送
        data, addr = client.recvfrom(1024)  # 接收服务器的提示信息
        if data.decode() == 'OK':  # 操作成功
            print('操作成功，您已进入聊天室\n（输入quit退出，输入PC私聊，默认公聊）')
            break
        else:  # 操作失败
            print(data.decode())  # 打印失败的原因
    # 创建进程
    pid = os.fork()
    if pid < 0:
        print('创建进程失败！')
        return
    elif pid == 0:  # 子进程发送信息
        sendmsg(client, name, address)
    else:  # 父进程接收信息
        recvmsg(client)


def sendmsg(client, name, address):
    while True:
        content = input('[公聊]我：')
        if content == 'quit':  # 退出聊天室
            message = '5 ' + name
            client.sendto(message.encode(), address)
            sys.exit('您已退出聊天室')  # 子进程退出
        elif content == 'PC':  # 进入私聊
            # 为了看得更清楚，添加5个tab，使私聊部分在右侧显示
            object = input('                    输入私聊对象用户名：')
            content = input('                   [私聊]我：')
            message = '4 ' + name + ' ' + object + ' ' + content
        else:
            message = '3 ' + name + ' ' + content
        client.sendto(message.encode(), address)  # 发送消息


def recvmsg(client):
    while True:
        message, addr = client.recvfrom(1024)
        if message.decode() == 'exit':  # 服务器提示退出
            os._exit(0)  # 父进程退出
        # 因为print覆盖了之前的input信息，重新输出一遍
        print(message.decode() + '\n[公聊]我：', end='')


if __name__ == "__main__":
    # 连接方式：python .\client.py 127.0.0.1 8080
    main()
